package com.interview.rtc.aigc.controller;

import com.alibaba.fastjson.JSON;
import com.interview.rtc.aigc.common.ResponseResult;
import com.interview.rtc.aigc.config.VolcengineConfig;
import com.interview.rtc.aigc.dao.UserDao;
import com.interview.rtc.aigc.service.AIGCServiceImpl;
import com.interview.rtc.aigc.service.SessionHistoryService;
import com.interview.rtc.aigc.utils.AccessToken;
import com.interview.rtc.aigc.utils.Utils;
import com.interview.rtc.aigc.vo.RtcTokenVO;
import com.interview.rtc.aigc.vo.VoiceChatRequestBuilder;
import com.interview.rtc.aigc.vo.VoiceChatRequestVO;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.volcengine.model.response.RawResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * AIGC代理控制器
 */
@RestController
@RequestMapping("/api")
public class AIGCProxyController extends BaseController {

    @Autowired
    private VolcengineConfig volcengineConfig;

    @Autowired
    private SessionHistoryService sessionHistoryService;

    private final ObjectMapper objectMapper = new ObjectMapper();
    private static final String prompt =
            "# 角色与核心指令\n" +
                    "\n" +
                    "你是一位高度专业、经验丰富且具备出色分析能力的 Java 高级技术面试官。\n" +
                    "\n" +
                    "**你的核心任务是：** 根据我提供给你的 **JSON 格式的候选人简历分析报告**，结合预设的 **“Java 技术面试官实时互动指引”** (以下简称“互动指引”)，对候选人进行一场深入、动态且高度个性化的技术模拟面试。\n" +
                    "\n" +
                    "**关键行动纲领：**\n" +
                    "\n" +
                    "1.  **深度解析JSON输入：** 在面试开始前，你必须彻底理解和消化提供的JSON数据。\n" +
                    "    * 重点关注 `candidateProjectAnalysis` 部分，特别是 `projectSummary` (核心职责、角色)，`skillsAssessment.hardSkills` (掌握的硬技能列表)，以及 `skillsAssessment.appliedSkillsInProjectDetails` (技能在项目中的具体应用细节)。这将是你理解候选人背景和经验的主要依据。\n" +
                    "    * 仔细阅读 `generatedInterviewQuestions` 部分。这些是基于简历分析生成的高度相关的初始问题集，你需要将它们自然地融入到面试流程中。注意每个问题附带的 `suggestedProbingPoints`，它们是追问的重要线索。\n" +
                    "    * 参考 `overallAssessmentNotes` 获取对候选人的初步整体印象和需要进一步确认的点。\n" +
                    "\n" +
                    "2.  **动态规划与执行面试流程：**\n" +
                    "    * 严格遵循“互动指引”中定义的面试阶段（开场、项目深挖、技术栈、Java基础、系统设计、动态调整、总结）。\n" +
                    "    * **核心在于“动态”与“个性化”**：\n" +
                    "        * **项目选择与深挖：** 在“互动指引”的第一阶段，引导候选人选择项目时，你可以参考JSON中 `appliedSkillsInProjectDetails` 提及的项目或 `generatedInterviewQuestions` 中涉及的项目。你的提问必须围绕JSON中分析出的候选人**实际参与过的项目**和**承担过的职责**。\n" +
                    "        * **技术栈提问：** 在“互动指引”的第二阶段，针对技术栈的提问必须以JSON中 `skillsAssessment.hardSkills` 列出的技能为核心，并结合 `appliedSkillsInProjectDetails` 中描述的这些技能的**具体应用场景**进行深入。例如，如果JSON提到候选人在项目A中使用了Redis做缓存，你的提问就应该围绕这个具体场景展开，而不是泛泛地问Redis的知识。\n" +
                    "        * **整合预设问题：** 将JSON中 `generatedInterviewQuestions` 里的问题，巧妙地、自然地穿插到“互动指引”相应的面试阶段和技术点讨论中。不要生硬地按顺序读出。\n" +
                    "        * **超越预设问题：** `generatedInterviewQuestions` 是起点，不是终点。你必须基于候选人的回答、JSON中的细节以及“互动指引”中的考察方向，**主动生成新的、有针对性的追问**。\n" +
                    "\n" +
                    "3.  **灵活运用“互动指引”中的策略：**\n" +
                    "    * 时刻谨记“互动指引”中“贯穿面试的动态调整与反馈处理策略提醒”部分。\n" +
                    "    * 当候选人回答不佳或表现优异时，运用指引中的策略进行引导、提示、调整问题难度或切换话题。\n" +
                    "    * 利用JSON中 `generatedInterviewQuestions.suggestedProbingPoints` 进行有效的深度挖掘。\n" +
                    "\n" +
                    "4.  **面试风格：**\n" +
                    "    * 保持专业、严谨、客观、尊重。\n" +
                    "    * 提问逻辑清晰，由浅入深，逐步增加复杂度。\n" +
                    "    * 营造自然的对话氛围，而非机械的问答。你的目标是进行一场基于候选人真实背景的、有逻辑的、流畅的深度对话。\n" +
                    "\n" +
                    "**输入格式说明：**\n" +
                    "\n" +
                    "我将首先向你提供一份JSON字符串，其结构如下（示例）：\n" +
                    "\n" +
                    "```json\n" +
                    "{\n" +
                    "  \"candidateProjectAnalysis\": {\n" +
                    "    \"projectSummary\": {\n" +
                    "      \"coreResponsibilities\": \"...\",\n" +
                    "      \"role\": \"...\"\n" +
                    "    },\n" +
                    "    \"skillsAssessment\": {\n" +
                    "      \"hardSkills\": [\"Java\", \"Spring\", \"...\"],\n" +
                    "      \"softSkills\": [\"...\", \"...\"],\n" +
                    "      \"appliedSkillsInProjectDetails\": \"...\"\n" +
                    "    }\n" +
                    "  },\n" +
                    "  \"generatedInterviewQuestions\": [\n" +
                    "    {\n" +
                    "      \"focusArea\": \"...\",\n" +
                    "      \"questionText\": \"...\",\n" +
                    "      \"suggestedProbingPoints\": [\"...\", \"...\"]\n" +
                    "    }\n" +
                    "    // ...更多问题\n" +
                    "  ],\n" +
                    "  \"overallAssessmentNotes\": \"...\"\n" +
                    "}";

    /**
     * 代理火山引擎AIGC的OpenAPI请求
     *
     * @param action API动作
     * @param roomId 房间ID（可选）
     * @return API响应
     */
    @PostMapping("/proxyAIGCFetch")
    public Object proxyAIGCRequest(
            @RequestParam("Action") String action,
            @RequestParam(value = "roomId", required = false) String roomId) {

        AIGCServiceImpl instance = AIGCServiceImpl.getInstance();
        instance.setAccessKey(volcengineConfig.getAccessKeyId());
        instance.setSecretKey(volcengineConfig.getSecretKey());

        String responseString;
        try {
            RawResponse rawResponse;

            if (action.equals("StartVoiceChat")) {
                // 获取当前用户信息
                UserDao userInfo = getUser();

                // 从params中只提取必要的房间ID和应用ID
                String appId = volcengineConfig.getRtcAppId();
                String userId = userInfo.getId() + "_" + userInfo.getUsername();

                // 获取该用户在该房间的历史消息
                List<String> userMessages = sessionHistoryService.getMessageHistoryForVoiceChat(
                        userInfo.getId(), roomId);

                // 创建请求对象
                VoiceChatRequestVO request = VoiceChatRequestBuilder.createWithDialogHistory(
                        appId,
                        roomId,
                        userId,
                        "亲爱的，" + userInfo.getUsername() + ",让我们开始面试吧！",
                        Arrays.asList(prompt,userInfo.getResume()),  // 空的系统消息
                        userMessages
                );

                // 转换为JSON字符串

                // 调用AIGC服务
                rawResponse = instance.StartVoiceChat(JSON.toJSONString(request));
            } else if (action.equals("StopVoiceChat")) {
                // 获取当前用户信息
                UserDao userInfo = getUser();
                String userId = userInfo != null ? userInfo.getId() + "_" + userInfo.getUsername() : "guest_user";

                // 创建停止语音聊天的请求对象
                Map<String, String> stopRequest = new HashMap<>();
                stopRequest.put("AppId", volcengineConfig.getRtcAppId());
                stopRequest.put("RoomId", roomId);
                stopRequest.put("TaskId", userId);

                // 转换为JSON字符串
                String requestJson = objectMapper.writeValueAsString(stopRequest);

                // 调用AIGC服务
                rawResponse = instance.stopVoiceChat(requestJson);
            } else {
                return ResponseResult.error(400, "不支持的action: " + action);
            }
            byte[] data = rawResponse.getData();
            responseString = new String(data, "UTF-8");
        } catch (Exception e) {
            return ResponseResult.error("AIGC请求处理失败: " + e.getMessage());
        }

        return responseString;
    }

    /**
     * 生成RTC访问令牌
     *
     * @param roomId 房间会话ID
     * @return 访问令牌VO对象
     */
    @PostMapping("/generate-rtc-token")
    public ResponseResult<RtcTokenVO> generateRtcToken(@RequestParam("roomId") String roomId) {
        // 从BaseController获取用户ID
        UserDao userInfo = getUser();
        if (userInfo == null || userInfo.getId() == null) {
            return ResponseResult.error(401, "未授权的请求");
        }

        try {
            // 使用VolcengineConfig中配置的RTC服务凭据
            String rtcAppId = volcengineConfig.getRtcAppId();
            String rtcAppKey = volcengineConfig.getRtcAppKey();

            // 创建AccessToken对象
            AccessToken token = new AccessToken(
                    rtcAppId,
                    rtcAppKey,
                    roomId,
                    userInfo.getId() + "_" + userInfo.getUsername()
            );

            // 设置过期时间为1小时后
            token.ExpireTime(Utils.getTimestamp() + 3600);
            token.AddPrivilege(AccessToken.Privileges.PrivSubscribeStream, 0);
            token.AddPrivilege(AccessToken.Privileges.PrivPublishStream, Utils.getTimestamp() + 3600);

            // 序列化令牌
            String serializedToken = token.Serialize();

            // 创建返回VO对象
            RtcTokenVO rtcTokenVO = new RtcTokenVO(
                    rtcAppId,
                    roomId,
                    userInfo.getId().toString(),
                    userInfo.getUsername(),
                    serializedToken
            );

            return ResponseResult.success(rtcTokenVO);
        } catch (Exception e) {
            return ResponseResult.error("生成RTC令牌失败: " + e.getMessage());
        }
    }

//    @PostMapping("/chat")
//    public ResponseEntity<Map<String, Object>> chat(@RequestBody Map<String, String> request, HttpServletRequest httpRequest) {
//        Long userId = getUserId(httpRequest);
//        Map<String, Object> response = aigcProxyService.chat(request, userId);
//        return ResponseEntity.ok(response);
//    }
//
//    @PostMapping("/generate")
//    public ResponseEntity<Map<String, Object>> generate(@RequestBody Map<String, String> request, HttpServletRequest httpRequest) {
//        Long userId = getUserId(httpRequest);
//        Map<String, Object> response = aigcProxyService.generate(request, userId);
//        return ResponseEntity.ok(response);
//    }
}
